<?php
/**
 * Работа с файлами (облегченный)
 * 
 * Класс для работы с файлами
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Базовый класс для работы с файлами
 *
 */
class File extends Base{
	/**
	 * Инстанс класа
	 *
	 * @var File
	 */
	private static $instance;

	public function __construct(){
		parent::__construct(__CLASS__);
	}
	/**
	 * Поличение инстанса класса
	 *
	 * @return File
	 */
	private static function getInstance() {
		if (self::$instance === null)
		return self::$instance = new self();
		else
		return self::$instance;
	}
	/**
	 * Базовая функция
	 * 
	 * Если указано $value то записываем если нет то читаем
	 * В $params можем передать режим записи mode= File::PREPEND, File::APPEND, FILE::CALLBACK или File::REWRITE(по умолчанию)
	 * при mode=File::CALLBACK обязательно должен быть ещё дополнительный параметр callback который может быть массивом array(class,method) либо строкой function
	 * callback функция должна принимать один строковой параметр и возвращать строковое значение которое потом будет записанно в файл
	 * если естановлен параметр add то значит файл обязательно должен уже существовать
	 * Если не указать никаких параметров то цункция вернёт инстанс
	 *
	 * @param string $name имя файла
	 * @param string $value содержимое для записи
	 * @param array $params mode=File::PREPEND | File::APPEND | FILE::CALLBACK | File::REWRITE, [callback=function | array(class,method)], [add=true] режим записи
	 * @return mixed true/false зри записи или содержимое файла при чтении
	 */
	public static function _($name=null,$value=null,$params=array()){
		//возвращает инстанс ели ничего не переданно
		if(!$name && !$value)return self::getInstance();
		//возвращает ошибку если не указанно имя файла
		if(!$name){
			new CoreExeption('Не указано имя файла для '.($value===null?"чтения":"записи"),E_ERROR,__FILE__,__LINE__);
			return false;
		}
		//если нет данных то читаем иначе пишем
		if($value===null){
			if(!file_exists(Config::_('path_file').FS.$name)){
                new CoreExeption('Не возможно прочитать файл '.$name.' так как он несуществует',E_WARNING,__FILE__,__LINE__);
                return false;
            }
            L('Прочитан файл '.$name);
            return file_get_contents(Config::_('path_file').FS.$name);
		}else{
			if(!$fo=fopen($name,'w')){
                new CoreExeption('Не удаётся открыть файл '.$name." на запись",E_WARNING,__FILE__,__LINE__,$params);
                return false;
            }
            if (fwrite($fo, $value) === FALSE) {
                new CoreExeption('Невозможно записать в файл '.$name,E_WARNING,__FILE__,__LINE__,$params);
                return false;
            }
            fclose($fo);
            L('Записан файл '.$name);
            return true;
		}
	}
	/**
	 * Проверка на существование файла
	 *
	 * @param string $name имя файла
	 * @return boolean true если файл существует, false если нет
	 */
	public static function exists($name=null){
		//возвращает ошибку если не указанно имя файла
		if(!$name){
			new CoreExeption('Не указано имя файла для проверки',E_ERROR,__FILE__,__LINE__);
			return null;
		}
		return file_exists(Config::_('path_file').FS.$name);
	}
	/**
	 * Удаление файла
	 *
	 * @param string $name имя файла
	 * @return boolean true если файл удалён успешно, false если нет
	 */
	public static function delete($name=null){
		//возвращает ошибку если не указанно имя файла
		if(!$name){
			new CoreExeption('Не указано имя файла для удаления',E_ERROR,__FILE__,__LINE__);
			return false;
		}
		if(!file_exists(Config::_('path_file').FS.$name)){
			new CoreExeption('Не возможно удалить файл '.$name.' так как он несуществует',E_WARNING,__FILE__,__LINE__);
			return false;
		}
		return unlink(Config::_('path_file').FS.$name);
	}
}